﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using UFIDA.U8.BJSOFT.LF.MES.WEBAPI.DBHelp;
using UFIDA.U8.BJSOFT.LF.MES.WEBAPI.Models;

namespace UFIDA.U8.BJSOFT.LF.MES.WEBAPI.Method
{
    public class AddRD09
    {
		public static string DBname = ConfigurationManager.AppSettings["U8DBNAME"].ToString();

		public static string Insert(string filename, string jsons)
		{
			Result mr = new Result();
			List<ItemsItemR> lim = new List<ItemsItemR>();
			int row = 0;
			string res = "";
			bool flag = !string.IsNullOrEmpty(jsons);
			if (flag)
			{
				try
				{
					List<string> list = new List<string>();
					RD10 rd = JsonConvert.DeserializeObject<RD10>(jsons);
					string dCode = rd.dCode;
					if (string.IsNullOrEmpty(dCode))
					{
						row = 1;
						res += "外部系统单号不允许为空!检查dCode字段";
					}
					else
					{
						int ifex2 = Convert.ToInt32(SQLHelper.GetString(string.Concat(new string[]
						{
							"select COUNT(*) from ",
							AddRD01.DBname,
							"..rdrecord09 where cCode='",
							dCode,
							"'"
						})));
						if (ifex2 > 0)
						{
							row = 1;
							res = string.Concat(new string[]
							{
								res,
								"外部系统单号[",
								dCode,
								"]在U8系统已存在",
								filename,
								"信息!"
							});
						}
					}
					string dDate = rd.dDate;
					if (!string.IsNullOrEmpty(dDate))
					{
						if (!PublicMet.IsDate(dDate))
						{
							row = 1;
							res += "日期格式不正确!例：[2024-11-12]";
						}
					}
					else
					{
						row = 1;
						res += "日期不允许为空！检查dDate字段";
					}

					string cRdCode = rd.cRdCode;
					if (string.IsNullOrEmpty(cRdCode))
					{
						row = 1;
						res += "类型不允许为空!检查cRdCode字段";
					}
					else
					{
						int ifex3 = Convert.ToInt32(SQLHelper.GetString(string.Concat(new string[]
						{
							"select COUNT(*) from ",
							AddRD01.DBname,
							"..Rd_Style where cRdCode='",
							cRdCode,
							"'"
						})));
						bool flag10 = ifex3 == 0;
						if (flag10)
						{
							row = 1;
							res = res + "类型[" + cRdCode + "]在U8系统不存在!";
						}
					}
					string cWhCode = rd.cWhCode;
					if (string.IsNullOrEmpty(cWhCode))
					{
						row = 1;
						res += "仓库编码不允许为空!检查cWhCode字段";
					}
					else
					{
						int ifex4 = Convert.ToInt32(SQLHelper.GetString(string.Concat(new string[]
						{
							"select COUNT(*) from ",
							AddRD01.DBname,
							"..Warehouse where cWhCode='",
							cWhCode,
							"'"
						})));
						if (ifex4==0)
						{
							row = 1;
							res = res + "仓库编码[" + cWhCode + "]在U8系统不存在!";
						}
					}
					string cMaker = rd.cMaker;
					bool flag12 = string.IsNullOrEmpty(cMaker);
					if (flag12)
					{
						row = 1;
						res += "制单人不允许为空!检查cMaker字段";
					}
					else
					{
						string cMakers = PublicMet.CUSERNAME(cMaker);
						if (string.IsNullOrEmpty(cMakers))
						{
							row = 1;
							res += "未找到编码为[" + cMaker + "]的制单人员!";
						}
						else
						{
							cMaker = cMakers;
						}
					}
					string cHandler = rd.cHandler;
					bool flag13 = string.IsNullOrEmpty(cHandler);
					if (flag13)
					{
						row = 1;
						res += "审核人不允许为空!检查cHandler字段";
					}
					else
					{
						string cHandlers = PublicMet.CUSERNAME(cHandler);
						if (string.IsNullOrEmpty(cHandlers))
						{
							row = 1;
							res += "未找到编码为[" + cHandler + "]的审核人员!";
						}
						else
						{
							cHandler = cHandlers;
						}
					}
					string cDepCode = rd.cDepCode;
					if (!string.IsNullOrEmpty(cDepCode))
					{
						int ifex5 = Convert.ToInt32(SQLHelper.GetString(string.Concat(new string[]
						{
							"select COUNT(*) from ",
							AddRD01.DBname,
							"..Department where cDepCode='",
							cDepCode,
							"'"
						})));
						bool flag16 = ifex5 == 0;
						if (flag16)
						{
							row = 1;
							res = res + "部门编码[" + cDepCode + "]在U8系统不存在!";
						}
					}
					string cMemo = rd.cMemo;
					string cAcc_Id = AddRD01.DBname.Substring(7, 3);
					int fidrd = 0;
					int cidrd = 0;
					string sql = " select iFatherId,iChildId from UFSystem..UA_Identity where cAcc_Id='" + cAcc_Id + "' and cVouchType='rd' ";
					DataTable dtidrd = SQLHelper.GetDataTable(sql);
					bool flag17 = dtidrd.Rows.Count > 0;
					if (flag17)
					{
						fidrd = Convert.ToInt32(dtidrd.Rows[0]["iFatherId"].ToString());
						cidrd = Convert.ToInt32(dtidrd.Rows[0]["iChildId"].ToString());
					}
					else
					{
						sql = " insert into UFSystem..UA_Identity (cAcc_Id,cVouchType,iFatherId,iChildId)  values('" + cAcc_Id + "','rd',0,0) ";
						SQLHelper.ExecuteSql(sql);
					}
					fidrd++;
					list.Add("update UFSystem..UA_Identity set iFatherId=iFatherId+1 where cAcc_Id='" + cAcc_Id + "' and cVouchType='rd' ");
					string ID = "1" + string.Format("{0:D9}", fidrd);
					string Code = dCode;
					string csysbarcode = "||st09|" + Code;
					string VT_ID = "85";    //版本号 默认   
					sql = @"insert into " + DBname + "..rdrecord09(ID,bRdFlag,cVouchType,cBusType,cSource,cWhCode,cdepcode,dDate,cCode,crdcode, " +
					   " bTransFlag,bpufirst,biafirst,VT_ID,bIsSTQc,bFromPreYear,bIsComplement,iDiscountTaxType,iBG_OverFlag,ControlResult,ireturncount, " +
					   " iverifystate,iswfcontrolled,bredvouch,iPrintCount,cMaker,dnmaketime,dVeriDate,cHandler,dnverifytime,cdefine10,csysbarcode,cMemo) " +
					   " values ( " + ID + ",0,'09','其他出库','库存','" + cWhCode + "',"+Method.PublicMet.setvalue(2,cDepCode)+", " +
								   " '" + dDate + "','" + dCode + "','" + cRdCode + "',0,0,0,'" + VT_ID + "',0,0,0,0,0,-1,0,0,0,0,0,'" + cMaker + "', " +
								   " getdate(),'" + dDate + "','" + cHandler + "',getdate(),NULL,'" + csysbarcode + "',"+Method.PublicMet.setvalue(2,cMemo)+") ";
					LogException.WriteiLog(filename, "RD09主表新增语句:" + sql, LogException.ilog, false);
					list.Add(sql);

					int cou = rd.Items.Count;
					for (int i = 0; i < cou; i++)
					{
						ItemsItemR mir = new ItemsItemR();
						string RowNo = rd.Items[i].RowNo;
						if (string.IsNullOrEmpty(RowNo))
						{
							row = 1;
							res = res + "第[" + (i + 1).ToString() + "]行行号不允许为空!检查RowNo字段";
						}
						string cInvCode = rd.Items[i].cInvCode;
						if (string.IsNullOrEmpty(cInvCode))
						{
							row = 1;
							res = res + "第[" + (i + 1).ToString() + "]行存货编码不允许为空!检查cInvCode字段";
						}
						else
						{
							int ifex7 = Convert.ToInt32(SQLHelper.GetString(string.Concat(new string[]
							{
								"select COUNT(*) from ",
								AddRD01.DBname,
								"..Inventory where cinvcode='",
								cInvCode,
								"'"
							})));
							bool flag22 = ifex7 == 0;
							if (flag22)
							{
								row = 1;
								res = string.Concat(new string[]
								{
									res,
									"第[",
									(i + 1).ToString(),
									"]行存货编码[",
									cInvCode,
									"]在U8系统不存在!"
								});
							}
						}
						string iQuantity = rd.Items[i].iQuantity;
						bool flag23 = string.IsNullOrEmpty(iQuantity);
						if (flag23)
						{
							row = 1;
							res = res + "第[" + (i + 1).ToString() + "]行数量不允许为空!检查iQuantity字段!";
						}
						else
						{
							bool flag24 = !PublicMet.IsNumberic(iQuantity);
							if (flag24)
							{
								row = 1;
								res = string.Concat(new string[]
								{
									res,
									"第[",
									(i + 1).ToString(),
									"]行数量[",
									iQuantity,
									"]非数字类型!"
								});
							}
						}
						string cBatch = rd.Items[i].cBatch;
						bool cba = Convert.ToBoolean(SQLHelper.GetString(string.Concat(new string[]
						{
							"select isnull(bInvBatch,0) from ",
							AddRD01.DBname,
							"..Inventory where cinvcode='",
							cInvCode,
							"'"
						})));
						if (cba)
						{
							bool flag26 = string.IsNullOrEmpty(cBatch);
							if (flag26)
							{
								row = 1;
								res = string.Concat(new string[]
								{
									res,
									"第[",
									(i + 1).ToString(),
									"]行存货[",
									cInvCode,
									"]进行批次管理,批次不允许为空,检查cBatch字段!"
								});
							}
						}
						if (!cba && !string.IsNullOrEmpty(cBatch))
						{
							row = 1;
							res += "第[" + (i + 1) + "]行存货[" + cInvCode + "]未进行批次管理，不允许传批号!检查cBatch字段!";
						}
						string where = "";
                        if (cba)
                        {
							where += " and cbatch='" + cBatch + "'";
                        }
						sql ="select count(1) from " + DBname + "..CurrentStock where cwhcode='" + cWhCode + "' and cinvcode='" + cInvCode + "' and iquantity >= " + iQuantity + " " + where + "";
                        if (Convert.ToInt32(SQLHelper.GetString(sql))==0)
                        {
							row = 1;
							string errmsg = "";
							if (!string.IsNullOrEmpty(where))
							{
								errmsg += " 批号[" + cBatch + "] ";
							}
							res += "第[" + (i + 1) + "]行仓库["+cWhCode+"]存货[" + cInvCode + "]"+errmsg+"数量不足["+iQuantity+"]!不允许出库!";
						}

						string dMadeDate = rd.Items[i].dMadeDate;
						string cPosCode = rd.Items[i].cPosCode;
						if (row == 0)
						{
							cidrd++;
							SQLHelper.ExecuteSql("update UFSystem..UA_Identity set iChildId=iChildId+1 where cAcc_Id='" + cAcc_Id + "' and cVouchType='rd' ");
							string autoid = "1" + string.Format("{0:D9}", cidrd);
							string cbsysbarcode = "||st09|" + Code + "|" + (i + 1).ToString();
							string sqlunit = string.Concat(new string[]
							{
								"select  cSTComUnitCode,isnull(iChangRate,NULL) iChangRate   from ",
								AddRD01.DBname,
								"..inventory i  left join ",
								AddRD01.DBname,
								"..ComputationUnit c  on i.cSTComUnitCode=c.cComunitCode  where cinvcode='",
								cInvCode,
								"'"
							});
							LogException.WriteiLog(filename, "采购入库辅计量单位编码查询语句：" + sqlunit, LogException.ilog, false);
							DataTable dtiv = SQLHelper.GetDataTable(sqlunit);
							bool flag28 = dtiv.Rows.Count > 0;
							string cAssUnit;
							string iinvexchrate;
							if (flag28)
							{
								cAssUnit = "'" + dtiv.Rows[0]["cSTComUnitCode"].ToString() + "'";
								bool flag29 = !string.IsNullOrEmpty(dtiv.Rows[0]["iChangRate"].ToString());
								if (flag29)
								{
									iinvexchrate = (dtiv.Rows[0]["iChangRate"].ToString() ?? "");
								}
								else
								{
									iinvexchrate = "NULL";
								}
							}
							else
							{
								cAssUnit = "NULL";
								iinvexchrate = "NULL";
							}
							sql = @"insert into " + DBname + "..rdrecords09(AutoID,ID,cInvCode,iQuantity,irowno,iFlag,bLPUseFree," +
									  " iRSRowNO,iOriTrackID,bCosting,bVMIUsed,iExpiratDateCalcu,iordertype,cbatch,iposflag ,cPosition,cbsysbarcode,cAssUnit,iinvexchrate ) " +
									  " values( " + autoid + ",'" + ID + "','" + cInvCode + "'," +
									  " '" + iQuantity + "','" + RowNo + "',0,0,0,0,1,0,0,0,"+Method.PublicMet.setvalue(2,cBatch)+",1,NULL,'" + cbsysbarcode + "|"+RowNo+"'," + cAssUnit + "," + iinvexchrate + " ) ";
							LogException.WriteiLog(filename, "RD09子表新增语句:" + sql, LogException.ilog, false);
							list.Add(sql);

							list.Add(string.Concat(new string[]
							{
								"insert into ",
								AddRD01.DBname,
								"..IA_ST_UnAccountVouch09(IDUN,IDSUN,cVouTypeUN,cBustypeUN) values ('",
								ID,
								"','",
								autoid,
								"','09','其他出库')"
							}));
							mir.Autoid = "";
							mir.U8RowNo = (i + 1).ToString();
							mir.U8ID = autoid;
							lim.Add(mir);
						}
					}
					sql = string.Concat(new string[]
					{
						"exec ",
						AddRD01.DBname,
						"..pro_uptcurrentStock '",
						AddRD01.DBname,
						"','09','",
						ID,
						"'"
					});
					list.Add(sql);
					bool flag30 = row == 0;
					if (flag30)
					{
						int count = SQLHelper.ExecuteSqlTran(list);
						bool flag31 = count > 0;
						if (flag31)
						{
							res += "出库成功";
							mr.U8Code = dCode;
							mr.Items = lim;
							LogException.WriteiLog(filename, "RD09出库成功[" + dCode + "]", LogException.ilog, false);
						}
						else
						{
							row = 1;
							res += "出库失败";
						}
					}
				}
				catch (Exception ex)
				{
					row = 1;
					LogException.WriteiLog(filename, "RD08异常:" + ex.Message, LogException.ilog, true);
					res = res + "失败:" + ex.Message;
				}
			}
			else
			{
				row = 1;
				res += "未传任何数据!";
			}
			bool flag32 = row == 1;
			if (flag32)
			{
				mr.Code = "500";
				mr.Msg = res;
			}
			else
			{
				mr.Code = "200";
				mr.Msg = res;
			}
			return JsonConvert.SerializeObject(mr);
		}
	}
}